using System;

namespace Utils.MonoInject
{
    /// <summary>
    /// 自动注入属性 - 用于自动注入单个或多个组件
    ///
    /// 用法：
    ///    [AutoInject] private Rigidbody rb;
    ///    [AutoInject("Player")] private Transform playerTransform;
    ///
    /// 注意事项：
    /// - 只能用于继承自 Component 的类型或 Component 的集合类型（数组、List等）
    /// - 标记为 [AutoInject] 的字段会在 AutoInject() 方法调用时自动赋值
    /// - 如果指定 Label，会按名称精确查找组件；不指定则查找该类型的任意组件
    /// - IncludeInactive 控制是否包含未激活的 GameObject 上的组件（默认包含）
    /// - 建议在 Awake() 或 Start() 中调用 this.AutoInject() 进行自动注入
    /// - 如果查找失败会在控制台输出错误信息，但不会中断程序执行
    /// - 对于集合类型的组件注入，建议使用 [AutoInjectCollection] 属性
    /// </summary>
    [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
    public class AutoInjectAttribute : Attribute
    {
        /// <summary>
        /// 组件标签名称（用于按名称查找）
        /// </summary>
        public string Label { private set; get; }

        /// <summary>
        /// 是否包含未激活的 GameObject 上的组件
        /// </summary>
        public bool IncludeInactive { set; get; } = true;

        /// <summary>
        /// 默认构造函数 - 查找任意名称的组件
        /// </summary>
        public AutoInjectAttribute()
        {
            Label = string.Empty;
        }

        /// <summary>
        /// 指定标签名称的构造函数 - 按名称精确查找组件
        /// </summary>
        /// <param name="label">组件所在的 GameObject 名称</param>
        public AutoInjectAttribute(string label)
        {
            Label = label;
        }
    }
}